package com.example.filefusion.service;

import com.example.filefusion.dto.FileInfo;
import io.minio.ListObjectsArgs;
import io.minio.MinioClient;
import io.minio.Result;
import io.minio.messages.Item;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class FileListService {

    private static final Logger logger = LoggerFactory.getLogger(FileListService.class);

    @Autowired
    private MinioClient minioClient;

    @Value("${minio.bucket-name}")
    private String bucketName;

    public List<FileInfo> listFiles() throws Exception {
        return listFiles("");
    }
    
    public List<FileInfo> listFiles(String prefix) throws Exception {
        logger.info("开始获取文件列表: bucketName={}, prefix={}", bucketName, prefix);
        List<FileInfo> fileInfos = new ArrayList<>();
        
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder()
                        .bucket(bucketName)
                        .prefix(prefix)
                        .build()
        );
        
        logger.info("开始遍历文件列表");
        for (Result<Item> result : results) {
            Item item = result.get();
            String objectName = item.objectName();
            boolean isDir = item.isDir();
            
            // 如果指定了前缀，我们需要去掉前缀部分显示
            String displayName = objectName;
            if (!prefix.isEmpty() && objectName.startsWith(prefix)) {
                displayName = objectName.substring(prefix.length());
            }
            
            // 只显示直接子项（不显示嵌套更深的项）
            // 如果displayName包含斜杠，说明不是直接子项
            if (!displayName.isEmpty() && displayName.charAt(displayName.length() - 1) != '/') {
                if (displayName.contains("/")) {
                    // 这是一个文件夹，但我们只关心直接子项
                    String directSubItem = displayName.substring(0, displayName.indexOf("/") + 1);
                    if (fileInfos.stream().noneMatch(fi -> fi.getName().equals(directSubItem))) {
                        FileInfo folderInfo = new FileInfo();
                        folderInfo.setName(directSubItem.replaceAll("/$", "")); // 去掉末尾的斜杠用于显示
                        folderInfo.setDirectory(true);
                        folderInfo.setId(prefix + directSubItem); // 保持完整的路径作为ID
                        fileInfos.add(folderInfo);
                        logger.debug("发现文件夹: objectName={}, displayName={}", objectName, directSubItem);
                    }
                } else {
                    // 这是一个直接子项（文件或文件夹）
                    FileInfo fileInfo = new FileInfo();
                    fileInfo.setName(displayName);
                    fileInfo.setDirectory(isDir);
                    fileInfo.setId(objectName); // 使用完整的objectName作为ID
                    
                    fileInfos.add(fileInfo);
                    logger.debug("发现文件: objectName={}, displayName={}, isDir={}", objectName, displayName, isDir);
                }
            } else if (isDir && !displayName.equals(prefix) && !displayName.isEmpty()) {
                // 这是一个直接子文件夹
                FileInfo fileInfo = new FileInfo();
                fileInfo.setName(displayName.replaceAll("/$", "")); // 去掉末尾的斜杠用于显示
                fileInfo.setDirectory(true);
                fileInfo.setId(prefix + fileInfo.getName()); // 保持完整的路径作为ID
                
                fileInfos.add(fileInfo);
                logger.debug("发现文件夹: objectName={}, displayName={}", objectName, displayName);
            }
        }
        logger.info("文件列表获取完成，共 {} 个文件", fileInfos.size());
        
        return fileInfos;
    }
}